你有沒有想過,為什麼駭客能把一串亂七八糟的加密內容慢慢還原出明文?
其實,很多時候靠的就是一些簡單的數學運算。
在密碼學裡,有一個特別常見的小技巧,叫做xor,雖然很基礎但在很多題目中都會被使用到
今天就來學關於xor的運算以及他的特性吧!
XOR(Exclusive OR 異或)是一種邏輯運算,常用於密碼學和資料處理
運算規則是:兩個輸入位相同時,結果為0;兩個輸入位不同時,結果為1
在程式語言中,它通常用符號 ^
表示
真值表:相同為 0,不同為 1
Commutative (交換率):無論左右順序怎麼調換,結果都一樣:A ⊕ B = B ⊕ A
Associative (結合率):運算的先後順序不影響最終結果:A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C
Identity (恆等律):和 0 做 XOR,不會改變原本的數值:A ⊕ 0 = A
Self-Inverse (自反律):一個數和自己做 XOR,結果一定是 0:A ⊕ A = 0
Double Application (雙重應用):如果將相同的數字進行兩次 XOR,會回到原始數值:(A ⊕ B) ⊕ B = A
了解完他的特性之後就來看看題目會怎麼運用吧
這題我們主要要看的是以下檢查密碼的程式,這邊他會讀取我們的輸入作為password,然後將password每位元跟0x55做xor再去跟myBytes比對一不一樣
public boolean checkPassword(String password) {
if (password.length() != 32) {
return false;
}
byte[] passBytes = password.getBytes();
byte[] myBytes = {
0x3b, 0x65, 0x21, 0xa , 0x38, 0x0 , 0x36, 0x1d,
0xa , 0x3d, 0x61, 0x27, 0x11, 0x66, 0x27, 0xa ,
0x21, 0x1d, 0x61, 0x3b, 0xa , 0x2d, 0x65, 0x27,
0xa , 0x6c, 0x61, 0x6d, 0x37, 0x6d, 0x6d, 0x6d,
};
for (int i=0; i<32; i++) {
if (((passBytes[i] ^ 0x55) - myBytes[i]) != 0) {
return false;
}
}
return true;
}
(這裡(((passBytes[i] ^ 0x55) - myBytes[i]) != 0)
其實就是((passBytes[i] ^ 0x55) == myBytes[i])
)
了解了他的邏輯,我們可以運用前面說到的「將相同的數字進行兩次 XOR,會回到原始數值」的特性來解出我們的password
密碼 xor 0x55 = myBytes ⮕ 密碼 xor 0x55 xor 0x55 = myBytes xor 0x55 = 密碼
手算太慢了寫個python腳本來算吧~
myBytes = [
0x3b, 0x65, 0x21, 0x0a, 0x38, 0x00, 0x36, 0x1d,
0x0a, 0x3d, 0x61, 0x27, 0x11, 0x66, 0x27, 0x0a,
0x21, 0x1d, 0x61, 0x3b, 0x0a, 0x2d, 0x65, 0x27,
0x0a, 0x6c, 0x61, 0x6d, 0x37, 0x6d, 0x6d, 0x6d,
]
password = "".join(chr(b ^ 0x55) for b in myBytes)
print(password)
運行之後就得到這題的flag啦~
今天就介紹到這邊啦~希望大家都有了解今天的內容,明天將會從凱薩密碼開始講起!
想看更多,記得明天再來喔~